package bsh.compilation;

import java.io.Reader;
import java.util.List;
import java.util.Map;

import bsh.LoadedTrait;

/**
 * Contem informacoes sobre o script a ser compilado
 * 
 * @author takeshi
 */
public interface CompilationSource {

    /**
     * Deve devolver o nome interno da classe - normalmente o FQCN trocando os . por /
     * 
     * @return String
     */
    String internalName();

    /**
     * Devolve o script na forma de um Reader
     * 
     * @return {@link Reader}
     */
    Reader openReader();

    /**
     * Deve devolver o nome do arquivo de source - apenas o nome do arquivo e nao o pacote completo
     * 
     * @return String
     */
    String sourceCodeName();

    /**
     * Devolve os tipos dos campos que devem ser criados
     * 
     * @return {@link Map}
     */
    Map<String, Class<?>> fieldTypes();

    /**
     * Devolve os imports
     * 
     * @return {@link Map}
     */
    Map<String, Class<?>> typeAlias();

    /**
     * Devolve os imports *
     * 
     * @return List de String
     */
    List<String> wildcardImports();

    /**
     * Devolve as constantes que devem ser criadas. As constantes serao criadas como campos estaticos finais e inicializadas em um bloco de
     * inicializacao estatica. Apenas primitvas, Strings e enums sao permitidas.
     * 
     * @return {@link Map}
     */
    Map<String, Object> constants();

    /**
     * @return a superclasse deste script.
     */
    Class<?> superType();

    /**
     * Devolve o FQCN para ser carregado / definido por um classloader
     * 
     * @return String
     */
    String className();

    /**
     * @return all the {@link LoadedTrait}
     */
    List<LoadedTrait> implementedTraits();

    /**
     * @return all the implemented interfaces
     */
    List<Class<?>> implementedInterfaces();

}
